Spring 的 ApplicationContext 应用上下文学习
Spring ApplicationContext 是什么?
Spring 管理的这些类被称为 Bean,并且生活在 Spring 容器中。Bean 处理程序的最基本实现是 Bean Factory。一般 org.springframework.beans.factory.BeanFactory 接口的实现类,用于初始化,配置和管理 Bean 的容器。
但通常在 Spring 应用程序中仅使用 BeanFactory 是不够的。所以它出现在应用程序上下文中。
应用程序上下文(Application context)是一种面向企业化的 Bean 工厂。
作为标准 Bean 工厂,它是 Bean class 生活的空间。但与标准 Bean 工厂不同,应用程序上下文提供了一个补充企业层(也就是通用 的东西了,比如企业里的胸牌,服装等)。
举个例子:例如,通过提供国际化,转换服务或事件传播,使我们省去很多麻烦去亲自处理。通常,应用程序上下文优于单独使用 Bean 工厂。
Application context 它的唯一缺点是内存消耗比 Bean 工厂大,出现这种情况是由于上面说的额外补充的服务。所以如果对内存要求非常苛刻,一般还是使用 Bean factory 的方式。
BeanFactory 和 ApplicationContext 的区别?
BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器。其中 ApplicationContext 是 BeanFactory 的子接口。这里总结一下它们的区别
依赖关系
BeanFactory:是 Spring 里面最底层的接口,包含了各种 Bean 的定义,读取 bean 配置文档,管理 bean 的加载、实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系。
ApplicationContext 接口作为 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,还提供了更完整的框架功能:比如说继承 MessageSource,因此支持国际化、统一的资源文件访问方式、提供在监听器中注册 bean 的事件、同时加载多个配置文件、载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web 层。
加载方式
BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用 getBean()),才对该 Bean 进行加载实例化。这样,我们就不能发现一些存在的 Spring 的配置问题。
如果 Bean 的某一个属性没有注入,BeanFacotry 加载后,直至第一次使用调用 getBean 方法才会抛出异常。
ApplicationContext,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext 启动后预载入所有的单实例 Bean,通过预载入单实例 bean,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
相对于基本的 BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置 Bean 较多时,程序启动较慢。
创建方式
BeanFactory 通常以编程的方式被创建,ApplicationContext 还能以声明的方式创建,如使用 ContextLoader。
注册方式
BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,但两者之间的区别是:BeanFactory 需要手动注册,而 ApplicationContext 则是自动注册。